#include <stdio.h>
#include "Patient.h"
#include <string.h>
#include<stdlib.h>
#include "menu_patient.h"
#define capacity 300

int test_jour_entree(patient *pat)
{
	int test=0;
	if((pat->date_entree.mois==4)||(pat->date_entree.mois==6)||(pat->date_entree.mois==9)||(pat->date_entree.mois==11))
		{
		if(pat->date_entree.jour>30)
			{test=1;}
		}
	else if ((pat->date_entree.mois==2)&&(test==0))
		{
		if(pat->date_entree.jour>29)
			{test=1;}
		}
	else
		if(pat->date_entree.jour>31)
			{test=1;}
return test;
}

int test_jour_sortie(patient *pat)
{
	int test=0;
	if((pat->date_sortie.mois==4)||(pat->date_sortie.mois==6)||(pat->date_sortie.mois==9)||(pat->date_sortie.mois==11))
		{
		if(pat->date_sortie.jour>30)
			{test=1;}
		}
	else if ((pat->date_sortie.mois==2)&&(test==0))
		{
		if(pat->date_sortie.jour>29)
			{test=1;}
		}
	else
		if(pat->date_sortie.jour>31)
			{test=1;}
return test;
}

int comparer_cin_pat(patient *pat)
{ FILE *f;
  FILE *y;
  patient p;
  int res=0,res1=0,res2=0;
  f=fopen("fichier_patient","ab");
  if (f!=NULL)
	{
         while((fread(&p,sizeof(patient),1,f)!=0) && (res1==0))
 	    {
	      if(pat->cin==p.cin)
	       res1=1;
 	    }
 	}
  y=fopen("tmp3","ab");
  if ((y!=NULL) || (res1==0))
	{
         while((fread(&p,sizeof(patient),1,y)!=0) && (res2==0))
 	    {
	      if(pat->cin==p.cin)
	       res2=1;
 	    }
 	}
if( (res1==1) || (res2==1))
{res=1;}
return res;
}


int comparer_date(patient *pat)
{
int c=0;
if(pat->date_entree.annee<pat->date_sortie.annee)
{ c=1;}
else if (pat->date_entree.annee==pat->date_sortie.annee)
	{if (pat->date_entree.mois<pat->date_sortie.mois)
		{c=1;}
		else if (pat->date_entree.mois==pat->date_sortie.mois)
			{if (pat->date_entree.jour<pat->date_sortie.jour)
				{c=1;}
			}
	}
return c;
} 

int longueur_pat(int valeur)
{
	int l= 0;

	while(valeur !=0)
	{
		l++;
		valeur = valeur / 10;
	}
 return l;
}

void saisir_patient(patient *pat,char tmp3[],char fichier[]){
int res2=0;
int res=0;
int res1=0;
int res3=0;
FILE *y;
FILE *f;
patient p;
int valeur;
int c=0;
int c_cin=0;
int l=0;
int l2=0;
int test_j_entree=0;
int test_j_sortie=0;
char ch_sexe1[20]= "masculin";
char ch_sexe2[20]= "feminin";

	do {
	printf("Saisir CIN \n");
	scanf("%ld",&pat->cin);
	l=longueur_pat(pat->cin);
	c_cin=comparer_cin_pat(pat);
	} while ((l!=8) || (pat->cin <0) || (c_cin==1)); 

	printf("Saisir Nom \n");
	scanf("%s",pat->nom);fflush(stdin);

	printf("Saisir Prenom \n");
	scanf("%s",pat->prenom);fflush(stdin);
	
	do
	{
	printf("Saisir Age \n");
	scanf("%d",&pat->age);
	} while (pat->age<0);

	do
	{
	printf("Choisir sexe: feminin/masculin \n");fflush(stdin);
	scanf("%s",pat->sexe);
	} while ((strcmp(pat->sexe,ch_sexe1)!=0)&&
	(strcmp(pat->sexe,ch_sexe2)!=0));

	do {
	printf("Saisir Numero de telephone \n");
	scanf("%ld",&pat->numero_telephone);
	l=longueur_pat(pat->numero_telephone); }
	while ((pat->numero_telephone<0) || (l!=8));
	
	printf("Saisir adresse \n");fflush(stdin);
	scanf("%s",pat->adresse);

	do {
	res=0;
	res1=0;
	res2=0;
	res3=0;
	printf("Saisir identifiant ID \n");
	scanf("%d",&pat->ID);
	l=longueur_pat(pat->ID);
	y=fopen("tmp3.txt","a+");
	if (y!=NULL){
  		while(fread(&p,sizeof(patient),1,y)!=0 && res1==0)
		{
			if(pat->ID==p.ID)
			res1=1;
 		}
	}
	f=fopen(fichier,"rb");
  	if (f!=NULL){
  		while(fread(&p,sizeof(patient),1,f)!=0 && res==0)
			{if(pat->ID==p.ID)
			res=1;}
	}
	if((res==1)||(res1==1)){
		printf("ID deja existe\n");
		res2=1;}
 
		if((pat->ID<0) || (l!=5)){
		res3=1;
		printf("ID incorrect\n");
		}
	}
while (res3==1 || res2==1);

	printf("Saisir le numero de chambre  \n");fflush(stdin);
	scanf("%s",pat->num_chambre);

	
	printf("Saisir le numero de lit \n");fflush(stdin);
	scanf("%s",pat->num_lit);

	printf("Saisir le nom d'un parrain\n");fflush(stdin);
	scanf("%s",pat->nom_parrain);

	do {
	printf("Saisir le numero du parrain \n");
	scanf("%ld",&pat->num_tel_parrain);
	l=longueur_pat(pat->num_tel_parrain); }
	while ((pat->num_tel_parrain<0) || (l!=8));

	do {
	printf("Donnez la date d'entree: jour mois annee \n");
	scanf("%d %d %d",&(pat->date_entree.jour),&(pat->date_entree.mois),&(pat->date_entree.annee));
	l2=longueur_pat(pat->date_entree.annee);
	test_j_entree=test_jour_entree(pat);}
	while ((pat->date_entree.jour<0)||(pat->date_entree.mois<0)||
	(pat->date_entree.mois>12)||(pat->date_entree.annee<0)||(l2!=4)||(test_j_entree==1));

	do {
	printf("Donnez la date de sortie: jour mois annee \n");
	scanf("%d %d %d",&(pat->date_sortie.jour),&(pat->date_sortie.mois),&(pat->date_sortie.annee));
	l2=longueur_pat(pat->date_sortie.annee);
	test_j_sortie=test_jour_sortie(pat);
	c=comparer_date(pat);}
	while ((pat->date_sortie.jour<=0)||(pat->date_sortie.mois<=0)||(pat->date_sortie.mois>12)||(pat->date_sortie.annee<=0)||(l2!=4)||(c==0)||(test_j_sortie==1));
}

void enregistrer_patient(char fichier[],patient * pat,char tmp3[]){
   saisir_patient(pat,tmp3,fichier);
  FILE *f;
  f=fopen(fichier,"ab");
  if (f!=NULL){
  fwrite(pat,sizeof(patient),1,f);}
  fclose(f);
}

void lister_patient(char fichier[]){
	FILE *f;
	patient p;
	int i;  
  	f=fopen(fichier,"rb");
  	if (f!=NULL){
   		i=1;
  		while(fread(&p,sizeof(patient),1,f)!=0)
    			{printf("Patient n:%d \n ID: %d \n Nom patient : %s \n Prenom patient :%s \n Age : %d \n CIN : %ld \n Sexe: %s \n Num_telephone : %ld \n Adresse : %s \n Num_chambre : %s \n Num_lit : %s \n Nom_parrain : %s \n Num_tel_parrain : %ld \n Date_entree : %d %d %d \n Date_sortie : %d %d %d \n \n",i,p.ID,p.nom,p.prenom,p.age,p.cin,p.sexe,p.numero_telephone,
p.adresse,p.num_chambre,p.num_lit,p.nom_parrain,p.num_tel_parrain,p.date_entree.jour,p.date_entree.mois,p.date_entree.annee,
p.date_sortie.jour,p.date_sortie.mois,p.date_sortie.annee);
i++;}	
 		     } 
	fclose(f);	
}

int chercher_patient(char fichier[],char nom[],int ID){
  
  int res=0;
  FILE *f;
  patient p;
  printf("Donner le nom cherché \n");
  scanf ("%s",nom);
  printf("Donner son ID\n");
  scanf ("%d",&ID);
  f=fopen(fichier,"rb");
  if (f!=NULL)
	{while(fread(&p,sizeof(patient),1,f)!=0 && res==0)
		{
			if((strcmp(p.nom,nom)==0)&&(ID==p.ID))
				{res=1;}
 		}
	}
  if (res==1) { 
  printf(" \n ID: %d \n Nom patient : %s \n Prenom patient :%s \n Age : %d \n CIN : %ld \n Sexe: %s \n Num_telephone : %ld \n Adresse : %s   \n   Num_chambre : %s \n Num_lit : %s \n Nom_parrain : %s \n Num_tel_parrain : %ld \n Date_entree : %d %d %d \n Date_sortie : %d %d %d \n   \n",p.ID,p.nom,p.prenom,p.age,p.cin,p.sexe,p.numero_telephone,
p.adresse,p.num_chambre,p.num_lit,p.nom_parrain,p.num_tel_parrain,p.date_entree.jour,p.date_entree.mois,p.date_entree.annee,
p.date_sortie.jour,p.date_sortie.mois,p.date_sortie.annee);
  }
  fclose(f);
  return res;
}




void supprimer_patient( char fichier[])
{	
	char tmp3[]="tmp3.txt";
	int i=0;
	char tmp[]="tmp.txt";
	FILE *f ;
	FILE *t ;
	FILE *y;
	patient p;
	int ID;
	printf("\n Donner l'ID du patient que vous voulez retirer de la liste:\n");
	scanf("%d", &ID);
	f=fopen(fichier,"rb") ;
	t=fopen(tmp,"wb") ;
	y=fopen(tmp3,"a+");
	if (f!= NULL && t!=NULL)
		{
			while(fread(&p,sizeof(patient),1,f)!=0)
				{
					if( ID!=p.ID)
						{ fwrite(&p,sizeof(patient),1,t);}
					if(ID==p.ID)
						{fwrite(&p,sizeof(patient),1,y);}
				}
		}
	fclose(y);
	printf("Le patient est supprimé\n");
	fclose(f) ;
	fclose(t) ;
	f=fopen(fichier,"wb") ;
	t=fopen(tmp,"rb") ;
	while(fread (&p,sizeof(patient),1,t)!=0)
		{fwrite(&p,sizeof(patient),1,f) ;}
	fclose(f) ;
	fclose(t) ;
}

void init_patients(char fichier[])
{
 	FILE *f;
 	f=fopen(fichier,"wb");
 	fclose(f);
}

void afficher_archive_pat(char tmp3[]){
FILE *y;
patient p;
int i=1;  
  y=fopen("tmp3.txt","a+");
  if (y!=NULL){
  printf(" \n *** Archive des patients *** \n");
  while(fread(&p,sizeof(patient),1,y)!=0)
{printf(" \n Patient n= %d \n ID: %d \n Nom patient : %s \n Prenom patient :%s \n Age : %d \n CIN : %ld \n Sexe: %s \n Num_telephone : %ld \n Adresse : %s   \n   Num_chambre : %s \n Num_lit : %s \n Nom_parrain : %s \n Num_tel_parrain : %ld \n Date_entree : %d %d %d \n Date_sortie : %d %d %d \n   \n",i,p.ID,p.nom,p.prenom,p.age,p.cin,p.sexe,p.numero_telephone,
p.adresse,p.num_chambre,p.num_lit,p.nom_parrain,p.num_tel_parrain,p.date_entree.jour,p.date_entree.mois,p.date_entree.annee,
p.date_sortie.jour,p.date_sortie.mois,p.date_sortie.annee);
 i++;}} fclose(y);
}

void gestion_patients() {
	patient p[capacity];
	int n = 0;
	int choix;
	char fichier[capacity]="fichier_patient";
	char nom[30];
	int res;
	int ID;
	char tmp3[capacity]="tmp3.txt";
do {
afficher_menu_pat();
choix=choix_menu_pat();


	switch (choix) {
	case 1: 
	enregistrer_patient(fichier,p,tmp3);
	break;
	case 2: 
  	lister_patient(fichier);
	break;
	case 3:
	res=chercher_patient(fichier,nom,ID);
	if (res==1)
	{printf(" Le patient %s existe \n",nom);}
	else {printf("Le patient %s n'existe pas \n",nom);}
	break;
	case 4:
	supprimer_patient(fichier);
	break ;
	case 5:
	modifier_patient();
	break;
	case 6:
	init_patients(fichier);
	printf("Patients initialisés");
	break;
	case 7: afficher_archive_pat(tmp3);
	break;
	case 0:  printf("\n Retour au menu principal \n \n");break; break;
	default: printf("\n Mauvais choix \n");
	}
} while (choix!=0) ;	
}
